#include <iostream>

const int MAXN = 26 * 26 * 26; // 3位26进制数能组成的最大十进制数
int hashTable[MAXN]; //用来存放字符串转换的十进制数
int conver2String(char *s, int len);
void hashStringSearch();

/**
 * 问题描述：
 * 给出N个字符串（恰好由3位大写字母组成），再给出M个查询字符串，
 * 问每个查询字符串在N个字符串出现的次数
 */

void hashStringSearch()
{
    char source[][4] = {"SDF","XDE","EEE","ABC","DFG"}; int N = sizeof(source)/4;
    char subStr[][4] = {"XXX","EEE","SWE","DFG"}; int M = sizeof(subStr)/4;
    //第一步，先将N个字符串对转为N个十进制数(唯一)，以值为键存入hashTable，同时统计次数，计为hashTable对应键的值
    for(int i=0; i<N; i++) {
        hashTable[conver2String(source[i],3)]++;
    }
    //第二步，遍历M字符串，逐个转换为十进制数，并统计在hashTable中的次数
    for(int i=0; i<M; i++) {
        printf("subStr:%s,times:%d\n",subStr[i],hashTable[conver2String(subStr[i],3)]);
    }
}

/**
 * 辅助函数，将字符串转为十进制
 * @param s 字符串数组头指针
 * @param len 长度
 * @return 字符串转换后的十进制数
 */
int conver2String(char *s, int len) {
    int decNum = 0;
    for(int i=0; i<len; i++) {
        decNum = decNum * 26 + (s[i]-'A');
    }
    return decNum;
}

int main() {
    hashStringSearch();
    return 0;
}